package DynamicProxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * Created by rzd on 2017/4/6.
 */
public class CglibProxy implements MethodInterceptor {

    private Object target;
    public Object createProxyInstance(Object target){
        this.target = target;
        //生成代理对象
        Enhancer enhancer = new Enhancer();
        // 用于设置代理对象的父类
        enhancer.setSuperclass(this.target.getClass());
        //设置回调
        enhancer.setCallback(this);
        //创建代理对象
        return enhancer.create();
    }

    /**
     * proxy：目标对象代理的实例；
     * method:目标对象调用父类方法的method实例 ；
     * args:调用父类方法传递参数
     * methodProxy:代理的方法去调用目标方法
     */
    @Override
    public Object intercept(Object proxy, Method method, Object[] args,
                            MethodProxy methodProxy) throws Throwable {
        /*
         * 测试invoke方法的四个参数的含义
         */
        System.out.println("proxy:"+proxy.getClass());
        System.out.println("method:"+method.getName());
        System.out.println("methodProxy:"+methodProxy.getSuperName());
        if(args!=null&&args.length>0){
            for(Object obj : args){
                System.out.println("args:"+obj);
            }
        }

        //声明返回值
        Object returnValue = null;
        beforeMethod();
        //使用method和methodProxy参数都可以调用invoke方法，并且执行出来的效果一样
        //returnValue = methodProxy.invoke(target, args);
        returnValue = method.invoke(target, args);
        afterMethod();
        return returnValue;
    }

    public void beforeMethod(){
        System.out.println("----方法执行之前的操作----");
    }
    public void afterMethod(){
        System.out.println("----方法执行之后的操作----");
    }
}